//// 读写互斥锁
//
package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

//
//import (
//	"fmt"
//	"sync"
//	"time"
//)
//
//var (
//	x int
//	wg sync.WaitGroup
//	// lock sync.Mutex
//	rwLock sync.RWMutex
//)
//
//func read(){
//	rwLock.Lock()
//	x=x+1
//	time.Sleep(time.Millisecond)
//	rwLock.Unlock()
//	wg.Done()
//}
//
//func write(){
//	rwLock.Lock() //加锁
//	x=x+1
//	time.Sleep(time.Millisecond*5)
//	rwLock.Unlock() //解锁
//	wg.Done()
//}
//
//func main(){
//	start:=time.Now()
//	for i:=0;i<1000;i++{
//		wg.Add(1)
//		go read()
//	}
//
//	for i:=0;i<10;i++{
//		wg.Add(1)
//		go write()
//	}
//	wg.Wait()
//	fmt.Println(time.Now().Sub(start))
//}
var count int

var mutex sync.RWMutex

func write(n int) {
	rand.Seed(time.Now().UnixNano())
	fmt.Printf("写 goroutine %d 正在写数据...\n", n)
	mutex.Lock()
	num := rand.Intn(500)
	count = num
	fmt.Printf("写 goroutine %d 写数据结束，写入新值 %d\n", n, num)
	mutex.Unlock()

}
func read(n int) {
	mutex.RLock()
	fmt.Printf("读 goroutine %d 正在读取数据...\n", n)
	num := count
	fmt.Printf("读 goroutine %d 读取数据结束，读到 %d\n", n, num)
	mutex.RUnlock()
}
func main() {
	for i := 0; i < 10; i++ {
		go read(i + 1)
	}
	for i := 100; i < 110; i++ {
		go write(i + 1)
	}
	time.Sleep(time.Second * 5)
}
